<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License. 
-->
<html>
<head>
    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
    <style type="text/css">
        .dp-highlighter {
            width:95% !important;
        }
    </style>
    <style type="text/css">
        .footer {
            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
            background-repeat:     repeat-x;
            background-position:   left top;
            padding-top:           4px;
            color:                 #666;
        }
    </style>
    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
    <script type="text/javascript">
        SyntaxHighlighter.defaults['toolbar'] = false;
        SyntaxHighlighter.all();
    </script>
    <script type="text/javascript" language="javascript">
        var hide = null;
        var show = null;
        var children = null;

        function init() {
            /* Search form initialization */
            var form = document.forms['search'];
            if (form != null) {
                form.elements['domains'].value = location.hostname;
                form.elements['sitesearch'].value = location.hostname;
            }

            /* Children initialization */
            hide = document.getElementById('hide');
            show = document.getElementById('show');
            children = document.all != null ?
                    document.all['children'] :
                    document.getElementById('children');
            if (children != null) {
                children.style.display = 'none';
                show.style.display = 'inline';
                hide.style.display = 'none';
            }
        }

        function showChildren() {
            children.style.display = 'block';
            show.style.display = 'none';
            hide.style.display = 'inline';
        }

        function hideChildren() {
            children.style.display = 'none';
            show.style.display = 'inline';
            hide.style.display = 'none';
        }
    </script>
    <title>Namespace Configuration</title>
</head>
<body onload="init()">
<table border="0" cellpadding="2" cellspacing="0" width="100%">
    <tr class="topBar">
        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="core-developers-guide.html">Core Developers Guide</a>&nbsp;&gt;&nbsp;<a href="configuration-elements.html">Configuration Elements</a>&nbsp;&gt;&nbsp;<a href="namespace-configuration.html">Namespace Configuration</a>
        </td>
        <td align="right" valign="middle" nowrap>
            <form name="search" action="https://www.google.com/search" method="get">
                <input type="hidden" name="ie" value="UTF-8" />
                <input type="hidden" name="oe" value="UTF-8" />
                <input type="hidden" name="domains" value="" />
                <input type="hidden" name="sitesearch" value="" />
                <input type="text" name="q" maxlength="255" value="" />
                <input type="submit" name="btnG" value="Google Search" />
            </form>
        </td>
    </tr>
</table>

<div id="PageContent">
    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">Namespace Configuration</div>

        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14276">
                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14276">Edit Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14276">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14276">Add Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14276">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14276">Add News</a>
        </div>
    </div>

    <div class="pagecontent">
        <div class="wiki-content">
            <div id="ConfluenceContent"><p>The namespace attribute subdivides action configurations into logical modules, each with its own identifying prefix. Namespaces avoid conflicts between action names. Each namespace can have its own "menu" or "help" action, each with its own implementation. While the prefix appears in the browser URI, the tags are "namespace aware", so the namespace prefix does not need to be embedded in forms and links.</p>

<div class="confluence-information-macro confluence-information-macro-tip"><span class="aui-icon aui-icon-small aui-iconfont-approve confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Struts 2 Namespaces are the equivalent of Struts Action 1 modules, but more convenient and flexible.</p></div></div>

<h2 id="NamespaceConfiguration-DefaultNamespace">Default Namespace</h2>

<p>The default namespace is <code>""</code> - an empty string. The default namespace is used as a "catch-all" namespace. If an action configuration is not found in a specified namespace, the default namespace is also be searched. The local/global strategy allows an application to have global action configurations outside of the action element "extends" hierarchy.</p>

<p>The namespace prefix can be registered with Java declarative security, to ensure only authorized users can access the actions in a given namespace.</p>

<h2 id="NamespaceConfiguration-RootNamespace">Root Namespace</h2>

<p>A root namespace ("/") is also supported. The root is the namespace when a request directly under the context path is received. As with other namespaces, it will fall back to the default ("") namespace if a local action is not found.</p>

<h2 id="NamespaceConfiguration-NamespaceExample">Namespace Example</h2>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">
&lt;package name="default"&gt;
    &lt;action name="foo" class="mypackage.simpleAction"&gt;
        &lt;result name="success" type="dispatcher"&gt;greeting.jsp&lt;/result&gt;
    &lt;/action&gt;

    &lt;action name="bar" class="mypackage.simpleAction"&gt;
        &lt;result name="success" type="dispatcher"&gt;bar1.jsp&lt;/result&gt;
    &lt;/action&gt;
&lt;/package&gt;

&lt;package name="mypackage1" namespace="/"&gt;
    &lt;action name="moo" class="mypackage.simpleAction"&gt;
        &lt;result name="success" type="dispatcher"&gt;moo.jsp&lt;/result&gt;
    &lt;/action&gt;
&lt;/package&gt;

&lt;package name="mypackage2" namespace="/barspace"&gt;
    &lt;action name="bar" class="mypackage.simpleAction"&gt;
        &lt;result name="success" type="dispatcher"&gt;bar2.jsp&lt;/result&gt;
    &lt;/action&gt;
&lt;/package&gt;
</pre>
</div></div>

<h2 id="NamespaceConfiguration-HowtheCodeWorks">How the Code Works</h2>

<p>If a request for <code>/barspace/bar.action</code> is made, the <code>/barspace</code> namespace is searched for the <code>bar</code> action. If found, the <code>bar</code> action is executed, else it will fall back to the default namespace. In the Namespace Example, the <code>bar</code> action does exist in the <code>/barspace</code> namespace, so the <code>bar</code> action will be executed, and if "success" is returned, the request will be forwarded to <code>bar2.jsp</code>.</p>

<div class="confluence-information-macro confluence-information-macro-tip"><p class="title">Falling Back to Foo</p><span class="aui-icon aui-icon-small aui-iconfont-approve confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
<p>If a request is made to <code>/barspace/foo.action</code>, the namespace <code>/barspace</code> will be checked for action <code>foo</code>. If a local action is not found, the default namespace is checked. In the Namespace Example, there is no action <code>foo</code> in the namespace <code>/barspace</code>, therefore the default will be checked and <code>/foo.action</code> will be executed.</p></div></div>

<p>In the Namespace Example, if a request for <code>moo.action</code> is made, the root namespace ('/') is searched for a <code>moo</code> action; if a root action is not found, the default namespace is checked. In this case, the <code>moo</code> action does exist and will be executed. Upon success, the request would be forwarded to <code>bar2.jsp</code>.</p>

<div class="confluence-information-macro confluence-information-macro-tip"><p class="title">Getting to the Root</p><span class="aui-icon aui-icon-small aui-iconfont-approve confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
<p>If a request is made for <code>/foo.action</code>, the root <code>/</code> namespace will be checked. If <code>foo</code> is found, the root action will be selected. Otherwise, the framework will check the default namespace. In the Namespace Example, the <code>foo</code> action does not exist in the root namespace, so the default namespace is  checked, and the default <code>foo</code> action is executed.</p></div></div>

<div class="confluence-information-macro confluence-information-macro-note"><p class="title">Namespaces are not a path!</p><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
<p>Namespace are not hierarchical like a file system path. There is one namespace level. For example if the URL <code>/barspace/myspace/bar.action</code> is requested, the framework will first look for namespace <code>/barspace/myspace</code>. If the action does not exist at <code>/barspace/myspace</code>, the search will immediately fall back to the default namespace <code>""</code>. The framework will not parse the namespace into a series of "folders". In the Namespace Example, the <code>bar</code> action in the default namespace would be selected.</p></div></div></div>
        </div>

        
    </div>
</div>
<div class="footer">
    Generated by CXF SiteExporter
</div>
</body>
</html>
